<?php

class Model_UserPrivilege extends Model {
	
	
	function getPrivilege($user_id=0, $group_id=0){
		!$user_id && $user_id = -1;
		!$group_id && $group_id = -1;
		
		$ret = array();
		$data = $this->select('`privilege`',"where (`uid` = '$user_id' and `uid` != 0) or (`groupid` = '$group_id' and `groupid` !=0) group by `privilege`");
		foreach ($data as $datum){
			$ret[] = $datum['privilege'];
		}
		return $ret;
	}
	
	/**
	 * 删除用户权限
	 * 
	 * 如果没有给定$privilege,则删除该用户的所有特殊权限
	 * 如果给定的$privilege是字符串，则删除该字符串代表的权限
	 * 如果给定的$privilege是数组，则删除该数组中的所有权限
	 * 
	 * @param int $user_id
	 * @param array|string $privilege
	 * 
	 * @return int
	 * 
	 */
	function removeUserPrivilege($user_id,$privilege=null){
		return $this->removePrivilege($user_id,0,$privilege);
	}
	/**
	 * 删除用户组权限
	 * 
	 * 如果没有给定$privilege,则删除该用户的所有特殊权限
	 * 如果给定的$privilege是字符串，则删除该字符串代表的权限
	 * 如果给定的$privilege是数组，则删除该数组中的所有权限
	 * 
	 * @param int $group_id
	 * @param array|string $privilege
	 * 
	 * @return int
	 * 
	 */
	function removeGroupPrivilege($group_id,$privilege=null){
		return $this->removePrivilege(0,$group_id,$privilege);
	}
	/**
	 * 删除用户或用户组的权限
	 * 
	 * 如果没有给定$privilege,则删除该用户的所有特殊权限
	 * 如果给定的$privilege是字符串，则删除该字符串代表的权限
	 * 如果给定的$privilege是数组，则删除该数组中的所有权限
	 * 
	 * @param int $user_id
	 * @param int $group_id
	 * @param array|string $privilege
	 * 
	 * @return int
	 * 
	 */
	private function removePrivilege($user_id,$goup_id,$privilege=null){
		$user_id = intval($user_id);
		$group_id = intval($group_id);	
		($user_id == 0 && $goup_id ==0) && _halt("Model_UserPrivilege::removePrivilege的user_id与goup_id不能同时为0");

		if ( $privilege === null ){
			$where_sql = "";
		} else{
			
			if (empty($privilege)) {
				return 0;
			}
			
			is_array($privilege) && $privilege = join("','",$privilege);
			$where_sql = " and `privilege` in ('$privilege') ";
		}
		
		return $this->removeByCondition("where `uid` = $user_id and `groupid` = $goup_id $where_sql");
		
	}
	/**
	 * 添加用户或用户组的权限
	 * 
	 * 如果给定的$privilege是字符串，则删除该字符串代表的权限
	 * 如果给定的$privilege是数组，则删除该数组中的所有权限
	 * 
	 * @param int $user_id
	 * @param int $group_id
	 * @param array|string $privilege
	 * 
	 * @return int 添加的权限的数量
	 * 
	 */
	private function addPrivilege($user_id, $group_id, $privileges){
		$user_id = intval($user_id);
		$group_id = intval($group_id);
		(0 == $user_id && 0 == $group_id) && _halt("Model_UserPrivilege::addPrivilege的user_id与group_id不能同时为0");
		
		if (empty($privileges)) {
			return 0;
		}
		
		if (!is_array($privileges)) {
			$privileges = array($privileges);
		}
		
		$cnt = 0;
		foreach ($privileges as $privilege){
			$flag = $this->insert(	
						array('uid'=>$user_id, 
							  'groupid'=>$group_id, 
							  'privilege'=>$privilege)
					);
			$flag && $cnt++;
		}
		return $cnt;
	}

	function addUserPrivilege($user_id,$privileges){
		$user_id == 0 && _halt("Model_UserPrivilege::addUserPrivilege的user_id不能为0");
		return $this->addPrivilege($user_id,0,$privileges);
	}
	/**
	 * 保存用户或用户组的权限到数据库
	 * 
	 * 如果给定的$privilege是字符串，则删除该字符串代表的权限
	 * 如果给定的$privilege是数组，则删除该数组中的所有权限
	 * 
	 * @param int $user_id
	 * @param int $group_id
	 * @param array|string $privilege
	 * 
	 * @return int 添加的权限的数量
	 * 
	 */
	private function savePrivilege($user_id,$group_id,$privileges){
		$user_id = intval($user_id);
		$group_id = intval($group_id);
		
		($user_id == 0 && $group_id==0) &&  _halt("Model_UserPrivilege::saveUserPrivilege的user_id不能为0");

		//用户之前的权限
		$old_privilege = $this->getPrivilege($user_id,$group_id);

		//检查用户之前的权限和新赋予用户的权限，将旧的权限中相同的部分
		$same_elements = Helper_Array::get_same_elements($old_privilege,$privileges);
		
		
		$old_privilege = Helper_Array::remove_by_value($same_elements,$old_privilege);
		$new_privilege = Helper_Array::remove_by_value($same_elements,$privileges);

		
		$this->removePrivilege($user_id, $group_id, $old_privilege);
		return $this->addPrivilege($user_id, $group_id, $new_privilege);
		
	}
	
	/**
	 * 保存用户或用户组的权限到数据库
	 * 
	 * 如果给定的$privilege是字符串，则删除该字符串代表的权限
	 * 如果给定的$privilege是数组，则删除该数组中的所有权限
	 * 
	 * @param int $user_id
	 * @param int $group_id
	 * @param array|string $privilege
	 * 
	 * @return int 添加的权限的数量
	 * 
	 */	
	function saveUserPrivilege($user_id,$privileges){
		return $this->savePrivilege($user_id,0,$privileges);
	}

	/**
	 * 保存用户或用户组的权限到数据库
	 * 
	 * 如果给定的$privilege是字符串，则删除该字符串代表的权限
	 * 如果给定的$privilege是数组，则删除该数组中的所有权限
	 * 
	 * @param int $user_id
	 * @param int $group_id
	 * @param array|string $privilege
	 * 
	 * @return int 添加的权限的数量
	 * 
	 */	
	function saveGroupPrivilege($group_id,$privileges){
		return $this->savePrivilege(0,$group_id,$privileges);
	}
}
?>